package org.lcc.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Base64;
import java.util.Date;

/**
 * JWT工具类，用于生成、解析和验证JWT令牌
 */
@Component
public class JwtUtil {
    // 日志记录器
    private static final Logger logger = LoggerFactory.getLogger(JwtUtil.class);

    // JWT密钥
    @Value("${jwt.secret}")
    private String secret;

    // JWT过期时间
    @Value("${jwt.expiration}")
    private int expiration;

    /**
     * 生成JWT令牌
     *
     * @param username 用户名，用于设置JWT的主体
     * @return 生成的JWT令牌字符串
     */
    public String generateToken(String username) {
        logger.debug("Generating token for user: {}", username);
        byte[] keyBytes = Base64.getDecoder().decode(secret); // 解码Base64密钥
        String token = Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .signWith(SignatureAlgorithm.HS512, keyBytes) // 使用解码后的密钥
                .compact();

        // 在 Token 前面加上前缀 "NERV_"
        return "NERV_" + token;
    }

    /**
     * 从JWT令牌中提取用户名
     *
     * @param token JWT令牌字符串
     * @return 提取出的用户名
     */
    public String getUsernameFromToken(String token) {
        logger.debug("Extracting username from token: {}", token);
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    /**
     * 验证JWT令牌的有效性
     *
     * @param token JWT令牌字符串
     * @return 如果令牌有效返回true，否则返回false
     */
    public boolean validateToken(String token) {
        try {
            byte[] keyBytes = Base64.getDecoder().decode(secret); // 解码Base64密钥
            Jwts.parser().setSigningKey(keyBytes).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            logger.error("Invalid token: {}", token, e);
            return false;
        }
    }
}
